/**
*   @file hash.h
*   Interface para hash.c.
* 	Incluye estructuras y typedefs.
*   Fecha de ultima modificacion 06/11/2007.
*/
#ifndef _hashADT_h
#define _hashADT_h

/**
*   \var SLOTS
*	Constante con el tamanio de la tabla de hash inicialmente.
*/
#define	SLOTS	10000

/**
*	\typedef hashT
* 	Definicion del elemento almacenado en cada tabla de hash.
*/
typedef	void * hashT;

/**
*	\typedef eraseT
* 	Definicion del tipo de borrado (fisico o logico)
*/ 
typedef enum {BAJA_FISICA, BAJA_LOGICA, OCCUPIED} eraseT;

/**
*	\typedef fnCmp
* 	Puntero a funcion para comparar dos hashT.
*/ 
typedef int (* fnCmp)(hashT, hashT);

/**
*	\typedef fnHash
* 	Puntero a funcion de hashing.
*/ 
typedef int (* fnHash)(hashT, int interval);

/**
*	\typedef fnPrint
* 	Puntero a funcion que imprime el hashT.
*/
typedef void (* fnPrint)(hashT);

/**
*	\typedef hashADT
* 	Puntero al tipo concreto de dato de la tabla de hash.
*/ 
typedef struct hashCDT * hashADT;


/**
*	\fn newHash
*	Inicializa la tabla de hash y settea la funcion de comparacion y hasheo.
	@param hashfunction Funcion de hashing.
*   @param cmpElement Funcion de comparacion del elemento.  
*   @return hashADT puntero al CDT si todo esta bien, NULL en caso contrario.
*/
hashADT newHash(fnCmp cmpElement, fnHash hashfunction);

/**
*	\fn insertKey
*	Inserta un elemento en la tabla de hash.
*   @param hashtable tabla hash creada con newHash.
*   @param element Elemento a guardar en la tabla.
*   @param reps Entero con la cantidad de elementos que existen.
*   @return 1 si todo esta bien, 0 en caso contrario.
*/
int insertKey(hashADT hashtable, hashT element, int reps);

/**
*	\fn quantitySort
*	Genera un vector con los elementos de la tabla de Hash ordenados por cantidad, solamente
*	es util si se usa en conjunto con printSorted para imprimir los elementos de la tabla
*	ordenados por cantidad y muestra su correspondiente % sobre el total.
*   @param hashtable tabla hash creada con newHash.
*   @param dim Dimension del arreglo a devolver.
*   @return void* arreglo de respuesta si todo esta bien, NULL en caso contrario.
*/
void * quantitySort(hashADT hashtable, int * dim);

/**
*	\fn printSorted
*	Imprime la tabla de hash ordenada.
*   @param dim Dimension de la tabla.
* 	@param printfunction Funcion de impresion.
* 	@param totalamount Cantidad total de elementos.
*/
void printSorted(const void * sortedTable, int dim, fnPrint printfunction, int totalamount);

/**
*	\fn lookUp
*	Busca un elemento dentro de la tabla de hash.
*   @param hashtable tabla hash creada con newHash.
*   @param element Elemento dentro de la tabla.
*   @return 1 si todo esta bien, 0 en caso contrario.
*/
int lookUp(hashADT hashtable, hashT element);

/**
*	\fn freeHash
*	Libera la tabla de hash.
*   @param hashtable tabla hash creada con newHash.
*/
void freeHash(hashADT hashtable);


#endif
